﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIMCObjetoNegocio;
using SIMCFachadaNegocio;

namespace SIMCPresenter
{
    public interface ISeguridadView : IViewBase
    {        
        int IdUsuario { get; }
        Rol RolUsuario { get; set; }
        string ObjetoSeguridad { get; }
    }

    public abstract class PresenterSeguridadBase : PresenterBase
    {
        private ISeguridadView m_SeguridadView;
        protected FachadaSeguridad m_FachadaSeguridad;
        List<FuncionConSeguridad> m_Permisos;

        public PresenterSeguridadBase(ISeguridadView p_Seguridad)
            : base(p_Seguridad)
        {
            m_SeguridadView = p_Seguridad;
            m_FachadaSeguridad = new FachadaSeguridad();
            m_Permisos = new List<FuncionConSeguridad>();
            BuscarPermisos();            
        }

        protected void IniciarSeguridad()
        {
            EvaluarPermisos();
        }        

        protected abstract void EvaluarPermisos();

        private List<FuncionConSeguridad> BuscarPermisos()
        {
            m_Permisos = m_FachadaSeguridad.BuscarListaPermiso(m_SeguridadView.ObjetoSeguridad, string.Empty, m_SeguridadView.IdUsuario, m_SeguridadView.RolUsuario.Id);
            return m_Permisos;
        }

        protected bool PermitirEvento(string p_Evento, string p_Descripcion)
        {
            if (m_Permisos.ExisteEvento(p_Evento))
                return true;
            else
                return CrearFuncionConSeguridad(p_Evento, p_Descripcion);
        }

        private bool CrearFuncionConSeguridad(string p_Evento, string p_Descripcion)
        {
            FuncionConSeguridad funcion = FuncionConSeguridadFactory.Crear(m_SeguridadView.ObjetoSeguridad, p_Evento, p_Descripcion);
            Usuario user = UsuarioFactory.CrearUsuarioConRol(m_SeguridadView.IdUsuario, m_SeguridadView.RolUsuario.Id);
            return m_FachadaSeguridad.BuscarPermiso(user, funcion);
        }
    }
}
